#include "ui.h"


/**
 * @brief 初始化用户界面
 *
 * 初始化用户界面，包括初始化ILI9341屏幕、填充屏幕为白色以及在屏幕中间显示“WELCOME!”字样。
 */
void ui_init(void)
{
    // 初始化ILI9341
    ILI9341_Init();
    // 填充屏幕为白色
    ILI9341_Fill_Screen(WHITE);
    // 在屏幕中间显示“WELCOME!”字样，使用黑色以便在白色背景上可见
    ILI9341_Draw_Text("WELCOME!", 60, 100, BLACK, 4, WHITE); // 文本颜色已更正为BLACK
}




/**
 * @brief 在界面上绘制浮点数
 *
 * 将给定的浮点数格式化为保留3位小数的字符串，并在屏幕上绘制该字符串。
 *
 * @param value 要绘制的浮点数
 * @param y 字符串绘制的垂直坐标
 * @param COLOR 字符串的背景颜色
 */
void ui_draw_value(float value, int y ,uint32_t COLOR) 
{
    // 将浮点数value格式化为保留3位小数的字符串，并存储在字符数组str中
    char str[10];
    sprintf(str, "%.3f", value);

    // 在屏幕上绘制字符串str，位于坐标(VALUE_X, y)，使用TEXT_COLOR作为文本颜色，使用FONT_SIZE_SMALL作为字体大小，使用VALUE_COLOR作为背景颜色
    ILI9341_Draw_Text(str, VALUE_X, y, TEXT_COLOR, FONT_SIZE_LARGE, COLOR);
}

/**
 * @brief 根据级别绘制值
 *
 * 根据给定的值和阈值，使用不同的颜色绘制一个矩形框，并在矩形框上方绘制值。
 *
 * @param value 值
 * @param y 矩形框的垂直位置
 * @param low_color 低级别颜色
 * @param medium_color 中等级别颜色
 * @param high_color 高级别颜色
 * @param low_threshold 低级别阈值
 * @param medium_threshold 中等级别阈值
 */
void ui_draw_value_with_level(float value, int y, uint32_t low_color, uint32_t medium_color, uint32_t high_color, float low_threshold, float medium_threshold) {
    uint32_t LEVEL_COLOR;
    // 根据值的大小判断所属等级，并设置相应的颜色
    if (value <= low_threshold) {
        // 如果值小于等于低阈值，则颜色为低等级颜色
        LEVEL_COLOR = low_color;
    } else if (value > low_threshold && value <= medium_threshold) {
        // 如果值大于低阈值且小于等于中阈值，则颜色为中等级颜色
        LEVEL_COLOR = medium_color;
    } else {
        // 如果值大于中阈值，则颜色为高等级颜色
        LEVEL_COLOR = high_color;
    }
    // 使用所选颜色绘制矩形框
    ILI9341_Draw_Rectangle(VALUE_RECTANGLE_X, y, VALUE_WIDTH, VALUE_HEIGHT, LEVEL_COLOR);
    // 在矩形框上方绘制值
    ui_draw_value(value, y +3, LEVEL_COLOR);
}





/**
 * @brief 绘制第一页UI界面
 *
 * 根据给定的温度、湿度和MCU温度绘制第一页的UI界面。
 *
 * @param temperature 环境温度值
 * @param humidity 环境湿度值
 * @param MCU_temperature MCU温度值
 */
void ui_draw_page_one(float temperature, float humidity, float MCU_temperature) 
{
    //等级颜色划分，绿色，红色，黄色
    uint32_t LEVEL_COLOR_GREEN = GREEN;
    uint32_t LEVEL_COLOR_YELLOW = YELLOW;
    uint32_t LEVEL_COLOR_RED = RED;

    // 定义常量以取代硬编码值
    const int HANZI_START_Y = 20;   //汉字起始坐标
    const int HANZI_SPACING = 40;   //汉字间距
    const int RECTANGLE_Y = 10;     //矩形框坐标
    const int SCREEN_BORDER_X1 = 2; //屏幕边框坐标
    const int SCREEN_BORDER_X2 = 316;   //屏幕边框坐标
    const int SCREEN_BORDER_Y1 = 2;    //屏幕边框坐标
    const int SCREEN_BORDER_Y2 = 236;  //屏幕边框坐标
    const int HANZI_TEXT_COLOR = WHITE;
    const int HANZI_BG_COLOR = BLACK;
    const int HANZI_FONT_SIZE = 2;

    // 屏幕底色设置为黑色，四周为白色边框
    ILI9341_Fill_Screen(BACKGROUND_COLOR);
    ILI9341_Draw_Rectangle(SCREEN_BORDER_X1, SCREEN_BORDER_Y1, SCREEN_BORDER_X2, SCREEN_BORDER_Y2, SCREEN_BORDER_COLOR);
    
    // 绘制STM32H750VBT6字样，使用循环减少代码重复
    for (int i = 0; i < 7; i++) {
        ILI9341_Draw_Hanzi(i, HANZI_START_Y + i * HANZI_SPACING, RECTANGLE_Y, HANZI_TEXT_COLOR, HANZI_FONT_SIZE, HANZI_BG_COLOR);
    }

    
    // 绘制水平分割线
    ILI9341_Draw_Horizontal_Line(18, 42, 282, WHITE);
   // ILI9341_Draw_Line(0, 0, 320,240, WHITE);
    
    // 绘制温湿度文本显示区域图标
    ILI9341_Draw_Rectangle(RECTANGLE_X, TEMP_MCU_Y, RECTANGLE_WIDTH, RECTANGLE_HEIGHT, RECTANGLE_COLOR); // 芯片温度文本区域
    ILI9341_Draw_Rectangle(RECTANGLE_X, TEMP_AMB_Y, RECTANGLE_WIDTH, RECTANGLE_HEIGHT, RECTANGLE_COLOR); // 环境温度文本区域
    ILI9341_Draw_Rectangle(RECTANGLE_X, HUM_Y, RECTANGLE_WIDTH, RECTANGLE_HEIGHT, RECTANGLE_COLOR); // 环境湿度文本区域

    // 绘制分隔线和文本
    ILI9341_Draw_Vertical_Line(SEPARATOR_X, SEPARATOR_Y_START, SEPARATOR_Y_END, SEPARATOR_COLOR); // 绘制垂直线
    ILI9341_Draw_Text("TEM_MCU:", TEXT_X, TEMP_MCU_Y + 8, TEXT_COLOR, FONT_SIZE_SMALL, RECTANGLE_COLOR); // 芯片温度文本
    ILI9341_Draw_Text("TEM_AMB:", TEXT_X, TEMP_AMB_Y + 8, TEXT_COLOR, FONT_SIZE_SMALL, RECTANGLE_COLOR); // 环境温度文本
    ILI9341_Draw_Text("REL_HUM:", TEXT_X, HUM_Y + 8, TEXT_COLOR, FONT_SIZE_SMALL, RECTANGLE_COLOR); // 环境湿度文本


   // 绘制环境温度及其数值区域
    ui_draw_value_with_level(temperature, TEMP_AMB_Y, LEVEL_COLOR_GREEN, LEVEL_COLOR_YELLOW, LEVEL_COLOR_RED, TEMP_LOW_THRESHOLD, TEMP_MEDIUM_THRESHOLD);
    
    // 绘制环境湿度及其数值区域
    ui_draw_value_with_level(humidity, HUM_Y, LEVEL_COLOR_GREEN, LEVEL_COLOR_YELLOW, LEVEL_COLOR_RED, HUM_LOW_THRESHOLD, HUM_MEDIUM_THRESHOLD);
    
    // 绘制MCU温度及其数值区域
    ui_draw_value_with_level(MCU_temperature, TEMP_MCU_Y, LEVEL_COLOR_GREEN, LEVEL_COLOR_YELLOW, LEVEL_COLOR_RED, MCU_TEMP_LOW_THRESHOLD, MCU_TEMP_MEDIUM_THRESHOLD);
    


}




/*
构建下面三个函数，分别是画线、填充、画点函数
*/
UG_RESULT _HW_DrawLine(UG_S16 x1, UG_S16 y1, UG_S16 x2, UG_S16 y2, UG_COLOR c)
{
    ILI9341_Draw_Line(x1, y1, x2, y2, c);
    return UG_RESULT_OK;
}


UG_RESULT _HW_DrawPoint(UG_S16 x, UG_S16 y, UG_COLOR c)
{
    ILI9341_Draw_Pixel(x, y, c);
    return UG_RESULT_OK;
}

UG_RESULT _HW_FillRrame(UG_S16 x1, UG_S16 y1, UG_S16 x2, UG_S16 y2, UG_COLOR c)
{
    ILI9341_Fill_Rectangle_Efficient(x1, y1, x2, y2, c);
    return UG_RESULT_OK;
}









/***************************************************************************/













